/* eslint-disable no-case-declarations */
/* eslint-disable no-use-before-define */
/*
    let url = 'http://demo.com/api'
    例:
    ajax({
        url: url,
        success: function(data) {

        }
    })
*/
import store from "@/store";
import { param } from "./help";
const prefixPath = process.env.VUE_APP_API_PREFIX_URL;
export default function ajax(setting) {
  const timeout = 10000;
  // 设置参数的初始值
  const opts = {
    method: (setting.method || "GET").toUpperCase(), // 请求方式
    url: prefixPath + setting.url || "", // 请求地址
    async: setting.async || true, // 是否异步
    data: setting.data || "", // 参数
    success: setting.success || function() {}, // 请求成功回调
    error: setting.error || function() {} // 请求失败回调
  };
  const dataType = setting.dataType || "json"; // 解析方式
  // 创建ajax对象
  const xhr = new XMLHttpRequest();

  xhr.timeout = setting.timeout || timeout;
  // 设置响应返回的数据格式
  xhr.responseType = dataType;

  // 连接服务器open(方法GET/POST，请求地址， 异步传输)
  if (opts.method === "GET") {
    xhr.open(opts.method, opts.url + "?" + param(opts.data), opts.async);

    setHeaders(xhr, setting.headers);
    setToken(xhr);

    xhr.send();
  } else {
    xhr.open(opts.method, opts.url, opts.async);

    xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
    setHeaders(xhr, setting.headers);
    setToken(xhr);
    console.log(opts.data);
    xhr.send(JSON.stringify(opts.data));
  }

  /*
   ** 每当readyState改变时，就会触发onreadystatechange事件
   ** readyState属性存储有XMLHttpRequest的状态信息
   ** 0 ：请求未初始化
   ** 1 ：服务器连接已建立
   ** 2 ：请求已接受
   ** 3 : 请求处理中
   ** 4 ：请求已完成，且相应就绪
   */
  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 304)) {
      switch (dataType) {
        case "json":
          const json = JSON.parse(xhr.response);
          opts.success(json);
          break;
        default:
          opts.success(xhr.response);
          break;
      }
    }
  };

  xhr.onerror = function(err) {
    opts.error(err);
  };
}

function setToken(xhr) {
  const token = store.state.user.token;
  if (token) {
    xhr.setRequestHeader("Authorization", `Bearer ${token}`);
  }
}

function setHeaders(xhr, headers) {
  try {
    if (headers) {
      Object.keys(headers).forEach(i => {
        xhr.setRequestHeader(i, headers[i]);
      });
    }
  } catch (error) {
    console.log(error);
  }
}
